c6d7810
@@ -31,6 +31,9 @@
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * ExprNodeGenericFuncEvaluator.
  *
@@ -44,6 +47,7 @@
   transient Object rowObject;
   transient ExprNodeEvaluator[] children;
   transient GenericUDF.DeferredObject[] deferredChildren;
+  transient GenericUDF.DeferredObject[] childrenNeedingPrepare;
   transient boolean isEager;
   transient boolean isConstant = false;
 
@@ -73,6 +77,10 @@
public void prepare(int version) throws HiveException {
       }
     }
 
+    public boolean needsPrepare() {
+      return !(eval instanceof ExprNodeConstantEvaluator || eval instanceof ExprNodeNullEvaluator);
+    }
+
     public Object get() throws HiveException {
       if (!evaluated) {
         obj = eval.evaluate(rowObject, version);
@@ -113,9 +121,17 @@
public ExprNodeGenericFuncEvaluator(ExprNodeGenericFuncDesc expr) throws HiveExc
   @Override
   public ObjectInspector initialize(ObjectInspector rowInspector) throws HiveException {
     deferredChildren = new GenericUDF.DeferredObject[children.length];
+    List<GenericUDF.DeferredObject> childrenNeedingPrepare =
+        new ArrayList<GenericUDF.DeferredObject>(children.length);
     for (int i = 0; i < deferredChildren.length; i++) {
-      deferredChildren[i] = new DeferredExprObject(children[i], isEager);
+      DeferredExprObject deferredExprObject = new DeferredExprObject(children[i], isEager);
+      deferredChildren[i] = deferredExprObject;
+      if (deferredExprObject.needsPrepare()) {
+        childrenNeedingPrepare.add(deferredExprObject);
+      }
     }
+    this.childrenNeedingPrepare =
+        childrenNeedingPrepare.toArray(new GenericUDF.DeferredObject[childrenNeedingPrepare.size()]);
     // Initialize all children first
     ObjectInspector[] childrenOIs = new ObjectInspector[children.length];
     for (int i = 0; i < children.length; i++) {
@@ -163,8 +179,8 @@
protected Object _evaluate(Object row, int version) throws HiveException {
       return ((ConstantObjectInspector) outputOI).getWritableConstantValue();
     }
     rowObject = row;
-    for (int i = 0; i < deferredChildren.length; i++) {
-      deferredChildren[i].prepare(version);
+    for (GenericUDF.DeferredObject deferredObject : childrenNeedingPrepare) {
+      deferredObject.prepare(version);
     }
     return genericUDF.evaluate(deferredChildren);
   }
